package delphorm.entite.personne;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Utilisateur {
	//identifiant de l'utilisateur
	private Long id;
	private String nom;
	private String prenom;
	private String login;
	private String password;
	private String profession;
	private String adressePostale;
	private String etat;
	private String municipalite;
	private String ville;
	private String codepostal;
	private String pays;
	private String adresseElectronique;
	private String numeroTelephone;
	private String numeroFax ;
	//date à laquelle l'utilisateur a été enregistré
	private Date dateEnregistrement;
	//droits spécifiques à l'utilisateur
	private GroupeUtilisateur groupeUtilisateur;
	//les autres groupes collectif auxquels il appartient
	private Set groupes;
	
//	résumé des droits généraux
	private GroupeUtilisateur droitsGénéraux;
	
	
	public Utilisateur(Long id, String nom, String prenom, String login, String password, String profession, String adressePostale, String etat, String municipalite, String ville, String codepostal, String pays, String adresseElectronique, String numeroTelephone, String numeroFax, Date dateEnregistrement, GroupeUtilisateur groupeUtilisateur, Set groupes) {
		super();
		this.id = id;
		this.nom = nom;
		this.prenom = prenom;
		this.login = login;
		this.password = password;
		this.profession = profession;
		this.adressePostale = adressePostale;
		this.etat = etat;
		this.municipalite = municipalite;
		this.ville = ville;
		this.codepostal = codepostal;
		this.pays = pays;
		this.adresseElectronique = adresseElectronique;
		this.numeroTelephone = numeroTelephone;
		this.numeroFax = numeroFax;
		this.dateEnregistrement = dateEnregistrement;
		if(groupeUtilisateur == null)
			this.groupeUtilisateur = new GroupeUtilisateur(null,this);
		else
		{
			this.groupeUtilisateur = groupeUtilisateur;
		}
		if(groupes != null)
			this.groupes = groupes;
		else
			this.groupes = new HashSet();
	}
	
	public Set getGroupes() {
		return groupes;
	}
	public void setGroupes(Set groupes) {
		this.groupes = groupes;
	}
	public GroupeUtilisateur getGroupeUtilisateur() {
		return groupeUtilisateur;
	}
	public void setGroupeUtilisateur(GroupeUtilisateur groupeUtilisateur) {
		this.groupeUtilisateur = groupeUtilisateur;
	}
	public String getAdresseElectronique() {
		return adresseElectronique;
	}
	public void setAdresseElectronique(String adresseElectronique) {
		this.adresseElectronique = adresseElectronique;
	}
	public String getAdressePostale() {
		return adressePostale;
	}
	public void setAdressePostale(String adressePostale) {
		this.adressePostale = adressePostale;
	}
	public Date getDateEnregistrement() {
		return dateEnregistrement;
	}
	public void setDateEnregistrement(Date dateEnregistrement) {
		this.dateEnregistrement = dateEnregistrement;
	}
	public String getEtat() {
		return etat;
	}
	public void setEtat(String etat) {
		this.etat = etat;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getMunicipalite() {
		return municipalite;
	}
	public void setMunicipalite(String municipalite) {
		this.municipalite = municipalite;
	}
	public String getNom() {
		return nom;
	}
	public void setNom(String nom) {
		this.nom = nom;
	}
	public String getNumeroFax() {
		return numeroFax;
	}
	public void setNumeroFax(String numeroFax) {
		this.numeroFax = numeroFax;
	}
	public String getNumeroTelephone() {
		return numeroTelephone;
	}
	public void setNumeroTelephone(String numeroTelephone) {
		this.numeroTelephone = numeroTelephone;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPrenom() {
		return prenom;
	}
	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}
	public String getProfession() {
		return profession;
	}
	public void setProfession(String profession) {
		this.profession = profession;
	}
	public String getVille() {
		return ville;
	}
	public void setVille(String ville) {
		this.ville = ville;
	}


	public Utilisateur() {
		super();
		groupeUtilisateur= new GroupeUtilisateur(null, this);
	}


	public String getCodepostal() {
		return codepostal;
	}


	public void setCodepostal(String codepostal) {
		this.codepostal = codepostal;
	}


	public String getPays() {
		return pays;
	}


	public void setPays(String pays) {
		this.pays = pays;
	}
	
	public void calculerDroits()
	{
		GroupeUtilisateur droitsGeneraux= new GroupeUtilisateur(null,this);
		
		//initialisation avec les valeurs du groupe utilisateur
		boolean résultat_getAjouterUtilisateursTousGroupes = getGroupeUtilisateur().getAjouterUtilisateursTousGroupes().booleanValue();
		boolean résultat_getCreerGroupe = getGroupeUtilisateur().getCreerGroupe().booleanValue();
		boolean résultat_getCreerQuestionnaires = getGroupeUtilisateur().getCreerQuestionnaires().booleanValue();
		boolean résultat_getCreerToutesInstances = getGroupeUtilisateur().getCreerToutesInstances().booleanValue();
		boolean résultat_getModifierTousGroupes = getGroupeUtilisateur().getModifierTousGroupes().booleanValue();
		boolean résultat_getModifierTousQuestionnaires = getGroupeUtilisateur().getModifierTousQuestionnaires().booleanValue();
		boolean résultat_getModifierTousUtilisateurs = getGroupeUtilisateur().getModifierTousUtilisateurs().booleanValue();
		boolean résultat_getModifierToutesInstances = getGroupeUtilisateur().getModifierToutesInstances().booleanValue();
		boolean résultat_getSupprimerTousGroupes = getGroupeUtilisateur().getSupprimerTousGroupes().booleanValue();
		boolean résultat_getSupprimerTousQuestionnaires = getGroupeUtilisateur().getSupprimerTousQuestionnaires().booleanValue();
		boolean résultat_getSupprimerTousUtilisateurs = getGroupeUtilisateur().getSupprimerTousUtilisateurs().booleanValue();
		boolean résultat_getSupprimerToutesInstances = getGroupeUtilisateur().getSupprimerToutesInstances().booleanValue();
		boolean résultat_getSupprimerUtilisateursTousGroupes = getGroupeUtilisateur().getSupprimerUtilisateursTousGroupes().booleanValue();
		boolean résultat_getValiderToutesInstances = getGroupeUtilisateur().getValiderToutesInstances().booleanValue();
		boolean résultat_getVoirTousQuestionnaires = getGroupeUtilisateur().getVoirTousQuestionnaires().booleanValue();
		boolean résultat_getVoirToutesInstances = getGroupeUtilisateur().getVoirToutesInstances().booleanValue();
		boolean résultat_getVoirTousUtilisateurs = getGroupeUtilisateur().getVoirTousUtilisateurs().booleanValue();
		
		Iterator itGroupes;
		
		//calcul des droits communs d'un groupe et d'un groupeUtilisateur
		itGroupes = getGroupes().iterator();
		
		while(itGroupes.hasNext())
		{
			DroitGroupe dgroupe = (DroitGroupe)itGroupes.next();
			résultat_getAjouterUtilisateursTousGroupes = résultat_getAjouterUtilisateursTousGroupes || dgroupe.getGroupe().getAjouterUtilisateursTousGroupes().booleanValue();
			résultat_getCreerGroupe = résultat_getCreerGroupe || dgroupe.getGroupe().getCreerGroupe().booleanValue();
			résultat_getCreerQuestionnaires = résultat_getCreerQuestionnaires || dgroupe.getGroupe().getCreerQuestionnaires().booleanValue();
			résultat_getCreerToutesInstances = résultat_getCreerToutesInstances || dgroupe.getGroupe().getCreerToutesInstances().booleanValue();
			résultat_getModifierTousGroupes = résultat_getModifierTousGroupes || dgroupe.getGroupe().getModifierTousGroupes().booleanValue();
			résultat_getModifierTousQuestionnaires = résultat_getModifierTousQuestionnaires || dgroupe.getGroupe().getModifierTousQuestionnaires().booleanValue();
			résultat_getModifierTousUtilisateurs = résultat_getModifierTousUtilisateurs  ||  dgroupe.getGroupe().getModifierTousUtilisateurs().booleanValue();
			résultat_getModifierToutesInstances = résultat_getModifierToutesInstances || dgroupe.getGroupe().getModifierToutesInstances().booleanValue();
			résultat_getSupprimerTousGroupes = résultat_getSupprimerTousGroupes || dgroupe.getGroupe().getSupprimerTousGroupes().booleanValue();
			résultat_getSupprimerTousQuestionnaires =  résultat_getSupprimerTousQuestionnaires || dgroupe.getGroupe().getSupprimerTousQuestionnaires().booleanValue();
			résultat_getSupprimerTousUtilisateurs = résultat_getSupprimerTousUtilisateurs || dgroupe.getGroupe().getSupprimerTousUtilisateurs().booleanValue();
			résultat_getSupprimerToutesInstances =  résultat_getSupprimerToutesInstances || dgroupe.getGroupe().getSupprimerToutesInstances().booleanValue();
			résultat_getSupprimerUtilisateursTousGroupes =  résultat_getSupprimerUtilisateursTousGroupes || dgroupe.getGroupe().getSupprimerUtilisateursTousGroupes().booleanValue();
			résultat_getValiderToutesInstances = résultat_getValiderToutesInstances || dgroupe.getGroupe().getValiderToutesInstances().booleanValue();
			résultat_getVoirTousQuestionnaires = résultat_getVoirTousQuestionnaires || dgroupe.getGroupe().getVoirTousQuestionnaires().booleanValue();
			résultat_getVoirToutesInstances = résultat_getVoirToutesInstances || dgroupe.getGroupe().getVoirToutesInstances().booleanValue();
			résultat_getVoirTousUtilisateurs = résultat_getVoirTousUtilisateurs || dgroupe.getGroupe().getVoirTousUtilisateurs().booleanValue();
		}
		
		droitsGeneraux.setAjouterUtilisateursTousGroupes(new Boolean(résultat_getAjouterUtilisateursTousGroupes));
		droitsGeneraux.setCreerGroupe(new Boolean(résultat_getCreerGroupe));
		droitsGeneraux.setCreerQuestionnaires(new Boolean(résultat_getCreerQuestionnaires));
		droitsGeneraux.setCreerToutesInstances(new Boolean(résultat_getCreerToutesInstances));
		droitsGeneraux.setModifierTousGroupes(new Boolean(résultat_getModifierTousGroupes));
		droitsGeneraux.setModifierTousQuestionnaires(new Boolean(résultat_getModifierTousQuestionnaires));
		droitsGeneraux.setModifierTousUtilisateurs(new Boolean(résultat_getModifierTousUtilisateurs));
		droitsGeneraux.setModifierToutesInstances(new Boolean(résultat_getModifierToutesInstances));
		droitsGeneraux.setSupprimerTousGroupes(new Boolean(résultat_getSupprimerTousGroupes));
		droitsGeneraux.setSupprimerTousQuestionnaires(new Boolean(résultat_getSupprimerTousQuestionnaires));
		droitsGeneraux.setSupprimerTousUtilisateurs(new Boolean(résultat_getSupprimerTousUtilisateurs));
		droitsGeneraux.setSupprimerToutesInstances(new Boolean(résultat_getSupprimerToutesInstances));
		droitsGeneraux.setSupprimerUtilisateursTousGroupes(new Boolean(résultat_getSupprimerUtilisateursTousGroupes));
		droitsGeneraux.setValiderToutesInstances(new Boolean(résultat_getValiderToutesInstances));
		droitsGeneraux.setVoirTousQuestionnaires(new Boolean(résultat_getVoirTousQuestionnaires));
		droitsGeneraux.setVoirToutesInstances(new Boolean(résultat_getVoirToutesInstances));
		droitsGeneraux.setVoirToutesInstances(new Boolean(résultat_getVoirToutesInstances));
		droitsGeneraux.setVoirTousUtilisateurs(new Boolean(résultat_getVoirTousUtilisateurs));
		
		//complète avec les valeurs du groupe utilisateur
		droitsGeneraux.setCréerInstancesSonQuestionnaire(getGroupeUtilisateur().getCréerInstancesSonQuestionnaire());
		droitsGeneraux.setModifierSonInstanceSonQuestionnaire(getGroupeUtilisateur().getModifierSonInstanceSonQuestionnaire());
		droitsGeneraux.setModifierSonQuestionnaire(getGroupeUtilisateur().getModifierSonQuestionnaire());
		droitsGeneraux.setModifierToutesInstancesSonQuestionnaire(getGroupeUtilisateur().getModifierToutesInstancesSonQuestionnaire());
		droitsGeneraux.setSupprimerSonInstanceSonQuestionnaire(getGroupeUtilisateur().getSupprimerSonInstanceSonQuestionnaire());
		droitsGeneraux.setSupprimerSonQuestionnaire(getGroupeUtilisateur().getSupprimerSonQuestionnaire());
		droitsGeneraux.setSupprimerToutesInstancesSonQuestionnaire(getGroupeUtilisateur().getSupprimerToutesInstancesSonQuestionnaire());
		droitsGeneraux.setValiderSonInstanceSonQuestionnaire(getGroupeUtilisateur().getValiderSonInstanceSonQuestionnaire());
		droitsGeneraux.setValiderToutesInstancesSonQuestionnaire(getGroupeUtilisateur().getValiderToutesInstancesSonQuestionnaire());
		droitsGeneraux.setVoirSonInstanceSonQuestionnaire(getGroupeUtilisateur().getVoirSonInstanceSonQuestionnaire());
		droitsGeneraux.setVoirSonQuestionnaire(getGroupeUtilisateur().getVoirSonQuestionnaire());
	
		
		setDroitsGénéraux(droitsGeneraux);
	}

	public GroupeUtilisateur getDroitsGénéraux() {
		return droitsGénéraux;
	}

	public void setDroitsGénéraux(GroupeUtilisateur droitsGénéraux) {
		this.droitsGénéraux = droitsGénéraux;
	}
	
	public DroitGroupe getDroitGroupeCollectif(GroupeCollectif groupe)
	{
		Iterator itGroupes = this.getGroupes().iterator();
		while(itGroupes.hasNext())
		{
			DroitGroupe droitGroupeCourant = ((DroitGroupe)itGroupes.next());
			if(droitGroupeCourant.getGroupe().getNom().equals(groupe.getNom()))
				return droitGroupeCourant;
		}
		return null;
	}
	
	public boolean appartientAuGroupeCollectif(GroupeCollectif groupe)
	{
		Iterator itGroupes = this.getGroupes().iterator();
		while(itGroupes.hasNext())
		{
			GroupeCollectif groupeCourant = ((DroitGroupe)itGroupes.next()).getGroupe();
			if(groupeCourant.getNom().equals(groupe.getNom()))
				return true;
		}
		return false;
	}
//	public Set groupesCollectifsCommuns(Utilisateur autreUtilisateur)
//	{
//		Set ret = new HashSet();
//		
//		Iterator itGroupes = autreUtilisateur.getGroupes().iterator();
//		while(itGroupes.hasNext())
//		{
//			GroupeCollectif groupeCourantAutre = ((DroitGroupe)itGroupes.next()).getGroupe();
//			if(this.appartientAuGroupeCollectif(groupeCourantAutre))
//				ret.add(groupeCourantAutre);
//		}
//		
//		return ret;
//	}
	public Set droitsGroupesCollectifsCommuns(Utilisateur autreUtilisateur)
	{
		Set<DroitGroupe> ret = new HashSet<DroitGroupe>();
		
		Iterator itGroupes = this.getGroupes().iterator();
		while(itGroupes.hasNext())
		{
			DroitGroupe droitGroupeCourant = (DroitGroupe)itGroupes.next();
			if(autreUtilisateur.appartientAuGroupeCollectif(droitGroupeCourant.getGroupe()))
				ret.add(droitGroupeCourant);
		}
		
		return ret;
	}
}
